package com.h.chatroom.common.component;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;

import java.util.concurrent.ConcurrentHashMap;

// 通过这个类来 建立 userId 和 WebSocketSession 之间的连接，并且进行用户是否在线的区别
@Slf4j
@Component
public class OnlineUserManager {
    // 需要对于 上述建立连接的地方需要保证 线程安全，所以这里的 HashMap 需要使用带有线程安全的
    private ConcurrentHashMap<Integer, WebSocketSession> sessions = new ConcurrentHashMap<>();

    // 1).用户上线，将其键值对存储起来
    public void online(Integer userId,WebSocketSession session) {
        // 为了防止进行多开的形式，判断用户是否已经登录
        if(sessions.get(userId) != null) {
            // 用户已经存在了，就不记录映射，不返回任何
            log.error(userId + ": 这个用户已经登录了，登录失败");
            return;
        }
        sessions.put(userId,session);
        log.info(userId + ": 这个用户上线");
    }

    // 2).用户离线，将其键值对删除
    public void offline(Integer userId,WebSocketSession session) {
        // 需要判断当前传来的 session 和 哈希表 中存在的键值对是否是一个session，只有是相同的session 的时候才能进行删除
        WebSocketSession exitsSession = sessions.get(userId);
        if(exitsSession == session) {
            sessions.remove(userId);
            log.info(userId + ": 这个用户已经删除了");
        }
    }

    // 3).因为已将 建立 userId 和 WebSocketSession 之间的连接，之后可以根据 userId 来获取对应的 WebSocketSession
    public WebSocketSession getSession(Integer userId) {
        return sessions.get(userId);
    }
}
